package com.oyjd.fw.tool.bean;

import java.util.ArrayList;
import java.util.List;

import com.oyjd.fw.util.FileOP;

/**
 * 解析PowerDesign数据库脚本
 * 
 * @author 欧建东
 * @email oyjd@163.com
 * 
 */
public class DbScriptTeraParse {

	/**
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception {
		String path = "E:/sxFossDoc/06-operationmanagement/script/table.sql";
		List<TableVO> list = parse(path, "gb2312");
		for (TableVO vo : list) {
			System.out.println("表：" + vo.getTable());
			for (ColVO v : vo.getCols()) {
				System.out.println("    列：" + v);
			}
			System.out.println("--------------------------------------------------------------------------------------------\r\n");
		}
	}

	/**
	 * 解析
	 * 
	 * @param path
	 * @param encoding
	 * @return
	 * @throws Exception
	 */
	public static List<TableVO> parse(String path, String encoding) throws Exception {
		List<TableVO> list = new ArrayList<TableVO>();
		String c = FileOP.readFile(path, encoding);
		int p;
		TableVO tmp = null;
		while ((p = c.indexOf(";\r\n")) != -1) {
			String aim = c.substring(0, p).trim();
			int p1;
			if ((p1 = aim.lastIndexOf("*/")) != -1) {
				aim = aim.substring(p1 + 2).trim();
			}
			// 处理目标字符串
			if (aim.startsWith("CREATE TABLE") || aim.startsWith("CREATE multiset TABLE")) {
				tmp = parseOneTable(aim);
				list.add(tmp);
			} else if (null != tmp && aim.startsWith("COMMENT")) {
				parseOneTableNote(tmp, aim);
			}
			//
			c = c.substring(p + 1);
		}
		return list;
	}

	/**
	 * 解析一个table：表名、字段名对应的注释
	 * 
	 * 
	 * @param s
	 */
	private static void parseOneTableNote(TableVO vo, String aim) {
		String note = aim.substring(aim.indexOf("'") + 1, aim.lastIndexOf("'"));
		if (aim.startsWith("COMMENT ON TABLE") && -1 != aim.indexOf(vo.getTable().getName())) {
			vo.getTable().setDesc(note);
		} else if (aim.startsWith("COMMENT ON COLUMN")) {
			String col = aim.substring(aim.indexOf(".") + 1, aim.lastIndexOf("IS")).trim();
			for (ColVO v : vo.getCols()) {
				if (v.getName().equals(col)) {
					v.setDesc(note);
					break;
				}
			}
		}
	}

	/**
	 * 解析一个table：表名、字段名
	 * 
	 * 
	 * @param s
	 */
	private static TableVO parseOneTable(String s) {
		TableVO vo = new TableVO();
		int p = s.indexOf("(");
		int q = s.lastIndexOf(")");
		String a = s.substring(0, p).trim();
		a = a.replace("CREATE", "").replace("multiset", "").replace("TABLE", "").trim();
		vo.getTable().setName(a);
		String b = s.substring(p + 1, q).trim();
		String[] bs = b.split(",\r\n");
		for (String ss : bs) {
			if (ss.indexOf("CONSTRAINT") == -1) {
				vo.getCols().add(parseCol(ss.trim()));
			} else if (ss.indexOf("PRIMARY KEY") != -1) {
				String pk = ss.substring(ss.indexOf("(") + 1, ss.indexOf(")"));
				List<ColVO> tmp = vo.getCols();
				for (ColVO v : tmp) {
					if (v.getName().equals(pk)) {
						v.setPk(true);
						break;
					}
				}

			}
		}
		return vo;
	}

	/**
	 * 解析一行
	 * 
	 * @param s
	 * @return
	 */
	private static ColVO parseCol(String s) {
		ColVO vo = new ColVO();
		String[] ss = s.split(" ");
		List<String> tmp = new ArrayList<String>();
		for (String t : ss) {
			if ("".equals(t)) {
				continue;
			}
			tmp.add(t.trim());
		}

		for (int i = 0; i < tmp.size(); i++) {
			if (0 == i) {
				vo.setName(tmp.get(0).replaceAll("\"", ""));
			} else if (1 == i) {
				String t = tmp.get(1);
				vo.setOraType(t);
				if (-1 != t.indexOf("CHAR")) {
					vo.setType("String");
					String tlen = t.substring(t.indexOf("(") + 1, t.indexOf(")"));
					vo.setLen(Integer.parseInt(tlen));
				} else if (-1 != t.indexOf("DATE") || -1 != t.indexOf("TIMESTAMP")) {
					vo.setType("Date");
				} else if (-1 != t.indexOf("INT") || -1 != t.indexOf("NUMERIC")) {
					vo.setType("int");
				} else if (-1 != t.indexOf("FLOAT")) {
					vo.setType("float");
				} else if (-1 != t.indexOf("NUMBER")) {
					vo.setType("long");
				} else if (-1 != t.indexOf("LONG")) {
					vo.setType("long");
				} else if (-1 != t.indexOf("DECIMAL")) {
					vo.setType("float");
				}
			} else if (-1 != tmp.get(i).indexOf("'")) {
				String title = tmp.get(i).replaceAll("'", "");
				vo.setDesc(title);
			}
		}
		return vo;
	}

}
